'''
Created on 04/05/2013

@author: cristian
'''
from flask import Flask, session, redirect, url_for, escape, request, Response
from pm import app
from pm.models.TipoItem import TipoItem
from . import jsonifiedview
from pm.database import db
from pm.models.TiposItemFases import TiposItemFases
from pm.views import ensureParams
from pm.models.Fases import Fases
from pm.models.Proyectos import Proyectos
from pm.models.Atributos import Atributos
from pm.models.TiposItemAtributo import TiposItemAtributo

@app.route('/tipoitem/listartipoitem', methods=['GET', 'POST']) 
@jsonifiedview
def listarTipoItem():
    '''
    Lista todos los tipos de item del sistema
    @return: Lista de todos los tipos de item
    @rtype: JSON
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
    queryTipoItem = TipoItem.query
    queryTipoItem = queryTipoItem.filter(TipoItem.codigo.like('%' + params['codigo'] + '%')) if 'codigo' in params else queryTipoItem
    queryTipoItem = queryTipoItem.filter(TipoItem.descripcion.like('%' + params['descripcion'] + '%')) if 'descripcion' in params else queryTipoItem 
    queryTipoItem = queryTipoItem.filter(TipoItem.activo.like('%' + params['activo'] + '%')) if 'activo' in params else queryTipoItem
    
    return queryTipoItem.order_by(TipoItem.id_tipo_item).all()

@app.route('/tipoitem/crear', methods=['GET', 'POST']) 
@jsonifiedview
def crearTipoItem():
    '''
        Crea un nuevo permiso
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
        
    if not ensureParams(params,['codigo','descripcion','activo', 'id_fase']): 
        response ={"success" : False , "msg" : "Parametros Insuficientes"} 
        return response
    try:
        fase = Fases.query.filter(Fases.id_fase == params['id_fase']).one()
        proyecto = Proyectos.query.filter(Proyectos.id_proyecto == fase.id_proyecto).one()
        detalle= proyecto.nombre + "; "+fase.nombre
        tipoItem = TipoItem(params['codigo'],params['descripcion'],detalle, params['id_fase'], params['activo'])
        db.session.add(tipoItem)
        db.session.commit()
        response ={"success" : True , "msg" : "Creacion exitosa!!"} 
        return response
    except Exception, e:
        print e
        db.session.rollback()
        response ={"success" : False , "msg" : "Error en la base de datos!!"}
        return response 


    
@app.route('/tipoitem/modificar', methods=['GET', 'POST']) 
@jsonifiedview
def modificarTipoItem():
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params,['id','codigo','descripcion']): 
        response ={"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response
    try:
        tipoItem = TipoItem.query.filter(TipoItem.id_tipo_item == params['id']).update({'codigo':params['codigo'],
        'descripcion':params['descripcion']})
        db.session.commit()
        response ={"success" : True , "msg" : "Actualizacion exitosa!!"} 
        return response
        
    except Exception, e:
        db.session.rollback()
        response ={"success" : False , "msg" : "Error en la base de datos!!"}
        return response 


@app.route('/tipoitem/activardesactivar', methods=['GET', 'POST']) 
@jsonifiedview
def activarDesactivarTipoItem():
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params,['id','activo']): 
        response ={"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response
    try:
        tipoItemModif= TipoItem.query.filter(TipoItem.id_tipo_item==params['id']).update({'activo':params['activo']})
        db.session.commit()
        response ={"success" : True , "msg" : "Actualizacion exitosa!!"} 
        return response
    except Exception, e:
        db.session.rollback()
        response ={"success" : False , "msg" : "Error en la base de datos!!"}
        return response 

@app.route('/tipoitem/listarbyfase', methods=['GET', 'POST']) 
@jsonifiedview
def listarTipodeItemByFase():
    """
        lista los tipos de item que tiene asignado una fase
        @param id_fase: la fase de la cual se desean listar los TI 
    """
    params = {'GET':request.args, 'POST':request.form}[request.method]
    resp = []
    
    tiposItemFases = TiposItemFases.query.filter(TiposItemFases.id_fase == params['id_fase']).all()
    for tif in tiposItemFases: 
        tipoItem = TipoItem.query.filter(TipoItem.id_tipo_item == tif.id_tipo_item).one()
        resp.append(tipoItem)
        
    return resp


@app.route('/tipoitem/importar', methods=['GET', 'POST']) 
@jsonifiedview
def importarTipoItem():
    """
        Importa un tipo de item de una fase dada
        @param id_tipo_item: el id de la fase que desea importarse
        @param id_fase: el id de la fase donde desea importarse
    """
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    
    if not ensureParams(params,['id_tipo_item','id_fase']): 
        response ={"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response
    tipoItem = TipoItem.query.filter(TipoItem.id_tipo_item == params['id_tipo_item']).one()
    if(tipoItem.activo == False):
        response ={"success" : False , "msg" : "El tipo de item que desea importar no se encuentra activa"} 
        return response
    try:
        fase = Fases.query.filter(Fases.id_fase == params['id_fase']).one()
        if fase.estado==3 or fase.estado==4:
            response ={"success" : False , "msg" : "No se pueden realizar cambios sobre la fase"} 
            return response
        proyecto = Proyectos.query.filter(Proyectos.id_proyecto == fase.id_proyecto).one()
        detalle = proyecto.nombre + "; " +fase.nombre
        tipoItemNuevo = TipoItem(tipoItem.codigo, tipoItem.descripcion, detalle,fase.id_fase , True)
        db.session.add(tipoItemNuevo)
        db.session.commit()
        atributos= Atributos.query.filter(Atributos.id_tipo_item == tipoItem.id_tipo_item).filter(Atributos.activo == True).all()
        for a in atributos:
            atributoNuevo = Atributos(a.nombre_atributo, a.tipo, tipoItemNuevo.id_tipo_item,a.valor, a.activo)
            db.session.add(atributoNuevo)
        db.session.commit()
        response ={"success" : True , "msg" : "Importacion exitosa"} 
        return response
    except Exception, e:
        print e
        db.session.rollback()
        response ={"success" : True , "msg" : "Ups, ha ocurrido un error"} 
        return response
    
@app.route('/tipoitem/listartipoitembyfase', methods=['GET', 'POST']) 
@jsonifiedview
def listaTipoItemByFase():
    """
        Lista los tipos de item que tiene una fase
        @param id_fase: es la fase de la cual se listaran los tipos de item
    """
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = []
    
    if not ensureParams(params,['id_fase']): 
        return response
    
    tipoItem = TipoItem.query.filter(TipoItem.id_fase == params['id_fase'])
    tipoItem = tipoItem.filter(TipoItem.codigo.like('%' + params['codigo'] + '%')) if 'codigo' in params else tipoItem
    tipoItem = tipoItem.filter(TipoItem.descripcion.like('%' + params['descripcion'] + '%')) if 'descripcion' in params else tipoItem
    tipoItem = tipoItem.all()
    for ti in tipoItem:
        response.append(ti)
        
    return response

@app.route('/tipoitem/listardistinct', methods=['GET', 'POST']) 
@jsonifiedview
def listarTipoItemByFaseDistinct():
    """
        Lista los tipos de item que no tiene asignado una fase
        @param id_fase: el id de la fase de la cual se quieren listar los tipos de item
    """
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = []
    
    if not ensureParams(params,['id_fase']): 
        return response
    
    tipoItem = TipoItem.query.filter(TipoItem.id_fase != params['id_fase']).all()
    
    for ti in tipoItem:
        if ti not in response:
            response.append(ti)
            
    return response